home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The 640 MEG Shareware Studio 4
/
The 640 Meg Shareware Studio CD-ROM Volume IV (Data Express)(1994).ISO
/
clang
/
cuj0593.zip
/
1105056A
< prev
next >
Wrap
Text File
|
1993-05-16
|
2KB
|
113 lines
// main.cpp - Frog Pond Listing 2
#include <frog.h>
main()
{
PMF_VV pf = &Creature::move; // bound to a virtual
Pond walden;
Creature *p1 = new Creature(Creature::TADPOLE,"Wiggly");
walden.insert(p1);
Creature *p2 = new Creature(Creature::BULLFROG,"Croaker");
walden.insert(p2);
walden.activate( pf ); // Tell all creatures to move
return 0;
}
/---------------------------------------------------------
// Frog.h
#ifndef FROG_H
#define FROG_H
#include <iostream.h>
#include <rw/gslist.h>
class Creature
{
public:
enum type{BULLFROG,TADPOLE};
Creature(type,char *);
virtual void move() { object->move(); }
protected:
Creature() : object(0) {}// default invoked by derived
private:
Creature *object;
};
declare(GSlist,Creature)
class Frog : public Creature
{
protected:
char *name;
public:
Frog(char *p="Noname Frog") : name(p) {}
~Frog();
char *Name() { return name; }
virtual void move() {}
};
class Tadpole : public Frog
{
public:
Tadpole(char *name) : Frog(name) {};
void move(){cout << name << " Swimming jerkily\n";}
};
class Bullfrog : public Frog
{
public:
Bullfrog(char *name) : Frog(name) {};
void move() { cout << name << " - I'M JUMPING\n"; }
};
class Pond
{
GSlist(Creature) list; // singly linked creature list
public:
void activate( void (Creature::*pf) () );
void insert(Creature*);
};
// this typedef must be after the class declarations
// it may be useful to simplify declarations in the users program.
// useful for pointing to move(void)
typedef void (Creature::*PMF_VV)();
#endif
//------------------------------------------------------------
// Frog.cpp
#include <stdlib.h>
#include <frog.h>
void Pond::insert(Creature *f)
{
list.insert(f);
}
void Pond::activate( PMF_VV pmf_vv )
{
GSlistIterator(Creature) it(list);
Creature *resident;
while ( resident = it() )
{
(resident->*pmf_vv)();
}
}
Creature::Creature(Creature::type t,char *name)
{
if ( t == TADPOLE )
object = new Tadpole(name);
else if( t == BULLFROG)
object = new Bullfrog(name);
else
{
cerr << "Invalid type in Creature ctor/n";
exit(2);
}
}
Frog::~Frog() {}